package com.team.game.Game.Sprites;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PathMeasure;
import android.graphics.Rect;
import android.graphics.RectF;

import com.team.game.Assets;
import com.team.game.framework.Abstract.Sprites;
import com.team.game.framework.impl.Scale_X_Y;
import com.team.game.framework.impl.SurfaceThread;

import static com.team.game.framework.impl.Scale_X_Y.scale;


public class Sprite extends Sprites {

    public Sprite (PathMeasure pathMeasure, float time, int kind) {

        //задаем спрайту вид kind
        sprite = selectMob (kind);

        assert sprite != null;
        //получаем размеры одного спрайта
        //делим на количество изображений спрайтов в РЯДУ
        sprWidth = sprite.getWidth() / 9;
        //делим на количество рядов изображений
        sprHeight = sprite.getHeight() / 5;


        rectSrc = new Rect (0, sprHeight, sprWidth, sprHeight * 2);
        destenation = 60 * scale;

        rectDst = new RectF ();
        this.pathMeasure = pathMeasure;
        this.time = time;


        matrix = new Matrix ();

        //Получаем весь путь
       // pathMeasure.getMatrix (pathMeasure.getLength (), matrix, PathMeasure.POSITION_MATRIX_FLAG);

    }

    private Bitmap selectMob (int kind) {
        /* Каждый вид моба имеет свою скорость, запас здоровья, начальное здоровье и картинку */
        switch (kind) {
            case 0: {
                //устанавливаем начальное здоровье в максимальное
                start_hp = health = 300;
                speed = (float) (0.75 * Scale_X_Y.scale);
                return Assets.yarik;
            }
            case 1: {
                start_hp = health = 50;
                speed = (float) (0.65 * Scale_X_Y.scale);
                return Assets.orc;
            }
            default:
                throw new RuntimeException ("Unknown mob kind");
        }
    }

    private Paint paint = new Paint ();
    private Paint painthp = new Paint ();


    private RectF hp_bar = new RectF ();

    @Override
    public void drawSprite (Canvas canvas) {


        if (!deadSearch) { //Если моб еще жив
            if (sumTime > time) { //Если пришло время выхода
                painthp.setStrokeWidth (10 * scale);

                //красный фон хп бара
                painthp.setColor (Color.RED);
                canvas.drawLine (rectDst.left, rectDst.top, rectDst.right, rectDst.top, painthp);

                //зеленая полоса здоровья
                painthp.setColor (Color.GREEN);
                float p = ((rectDst.right - rectDst.left) * ((float) health / (float) start_hp));
                canvas.drawLine (rectDst.left, rectDst.top, rectDst.left + p, rectDst.top, painthp);

                canvas.drawBitmap(sprite, rectSrc, rectDst, null);

            }
        } else if (dead < 6) { //Если мертв то 6 кадров отрисовываем гроб
            if (fCounter > 0.05) {
                //rectSrc.left += sprWidth;
                //rectSrc.right += sprWidth;
                paint.setAlpha(255 - (dead * 35));
                dead++;
                fCounter = 0;
            } else
                fCounter += SurfaceThread.deltaTime;
            canvas.drawBitmap(sprite, rectSrc, rectDst, paint);
        }
    }


    @Override
    public void updateSprite () {
        if (!deadSearch) { //Если моб жив
            if (sumTime > time) { //Если время выхода моба пришло
                rectDst.setEmpty();

                //делим путь на небольшие сегменты
                pathMeasure.getMatrix(speed * frame, matrix, PathMeasure.POSITION_MATRIX_FLAG);

                //переводим матрицу в рект
                matrix.mapRect(rectDst);

                //
                rectDst.bottom += destenation;
                rectDst.right += destenation;

                frame += 187.5 * SurfaceThread.deltaTime;

                fCounter += SurfaceThread.deltaTime;

                x = rectDst.centerX();
                y = rectDst.centerY();

                if (Math.abs(y - last_y) > Math.abs(last_x - x) && last_y < y) {
                    rectSrc.top = sprHeight * 2;
                    rectSrc.bottom = sprHeight * 3;
                } else if (last_x > x) {
                    rectSrc.top = sprHeight;
                    rectSrc.bottom = sprHeight * 2;

                } else if (last_x < x) {
                    rectSrc.top = sprHeight * 3;
                    rectSrc.bottom = sprHeight * 4;

                } else {
                    rectSrc.top = 0;
                    rectSrc.bottom = sprHeight;
                }
                last_x = x;
                last_y = y;
                if (fCounter > 0.1) {
                    curFrame++;
                    if (curFrame >= 9) { //Если прошли все картнинки в ряду переходим к первой
                        curFrame = 0;
                    }
                    rectSrc.left = curFrame * sprWidth;
                    rectSrc.right = rectSrc.left + sprWidth;
                    fCounter -= 0.1;
                }
            } else
                sumTime += SurfaceThread.deltaTime;
        }
    }

    @Override
    public RectF getRect () {
        return rectDst;
    }

    public void spriteReboot(boolean restart) {
        if (!restart)
            if (!deadSearch)
                return;
        sumTime = 0;
        frame = 0;
        health = start_hp;
        dead = 0;
        deadSearch = false;
        rectSrc.left = 0;
        rectSrc.right = sprWidth;
        rectSrc.bottom = sprHeight * 2;
        rectSrc.top = sprHeight;
        rectDst.set(0, 0, 0, 0);
    }

    @Override
    public void dec(float kick) {
        health -= kick;
        if (health <= 0) {
            rectSrc.left = 0;
            rectSrc.right = sprWidth;
            rectSrc.bottom = sprHeight * 5;
            rectSrc.top = sprHeight * 4;
            deadSearch = true;
        }

    }

}
